#ifndef SIMPLE_IO_WRITER_BUF_H
#define SIMPLE_IO_WRITER_BUF_H

#include <vector>
#include <string>

namespace simple {
    class WriterBuf {
    private:
        // io句柄
        int write_fd_;
        // 缓冲区大小
        int buff_size_ = 2048;
        // 缓冲区
        char *buff_data_ = nullptr;
        // 写指针
        int volatile write_index = 0;

    public:
        explicit WriterBuf(int writeFd);

        WriterBuf(int writeFd, int buffSize);

        /**
         * 写入一个字节
         */
        int writeByte(char data);

        /**
         * 写入字节向量
         */
        int writeBytes(const std::vector<char> &data);

        /**
         * 写入字节数组
         */
        int writeBytes(const void *ptr, int size);

        /**
         * 写入字符串
         */
        int writeString(const std::string &data);

        /**
        * 自动刷新缓冲区, 直到缓冲区满或者关闭缓冲区
        */
        int autoFlush();

        /**
         * 刷新缓冲区, 把数据写入io句柄, 成功返回0, 失败返回-1
         */
        int flush();

        /**
         * 缓冲区数据字节数, 等待被写入到底层io句柄
         */
        [[nodiscard]] int buffered() const;

        /**
         * 缓冲区可用的容量, 缓冲区大小-缓冲区数据字节数
         */
        [[nodiscard]] int capacity() const;

        /**
         * 缓冲区大小
         */
        [[nodiscard]] int size() const;

        /**
         * 重置缓冲区, 清除数据
         */
        void reset();

        /**
         * 关闭缓冲区, 已有数据写入句柄
         */
        void close_();
    };
}

#endif //SIMPLE_IO_WRITER_BUF_H
